/*!
 * \file frshm_pool.h
 *
 * \brief 数据包移位、读取操作
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * 数据包移位、读取操作
 *
 * \version 3.0
 * \author guojq
 * \date 2016/02/02
 *
 */
#ifndef __FRSHM_POOL_H_
#define __FRSHM_POOL_H_

#include <sys/shm.h>

/*!
 * 创建共享内存
 *
 * \param p_file        (IPC文件名)
 * \param i_pool_size   (共享内存链表个数)
 * \param i_shm_size    (共享内存单个内存块大小)
 *
 * \return 共享内存ID\n
 *         -1 (失败)
 *
 *
 */
int frshm_pool_create(char *p_file, int i_pool_size, int i_shm_size);

/*!
 * 获取共享内存ID
 *
 * \param p_file        (IPC文件名)
 *
 * \return 共享内存ID\n
 *         -1 (失败)
 *
 */
int frshm_pool_get(char *p_file);

/*!
 * 向共享内存里写入数据(需要外面加锁)
 *
 * \param i_shmid       (共享内存ID)
 * \param p_data        (需要写入的数据内容)
 * \param i_data_len    (需要写入的数据内容长度)
 *
 * \return >0 :写入的数据长度\n
 *         =0 :缓冲池已满\n
 *         <=0:失败
 *
 *
 */
int frshm_pool_write(int i_shmid, void *p_data, int i_data_len);
#define FRSHM_POOL_PUSH(x,y,z) frshm_pool_write(x,y,z)

/*!
 * 从共享内存里读取数据(需要外面加锁)
 *
 * \param i_shmid       (共享内存ID)
 * \param pp_data       (读取到的数据内容)
 *
 * \return >0:读取的数据长度\n
 *          0:没有数据\n
 *         -1:失败
 *
 *
 */
int frshm_pool_read(int i_shmid, void **pp_data);
#define FRSHM_POOL_POP(x,y) frshm_pool_read(x,y)

/*!
 * 释放共享内存
 *
 * \param i_shmid       (共享内存ID)
 *
 * \return void
 *
 *
 */
void frshm_pool_free(int i_shmid);


#endif
